Visual Basic for Applications

微软开发的自动化任务编程语言

Visual Basic for Applications

Visual Basic for Applications,其简称为VBA,是Visual Basic的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。[0]主要用来扩展Windows的应用程序功能,特别是Microsoft Office软件,也可说是一种应用程式视觉化的Basic脚本,实际上,VBA是寄生于VB应用程序的版本。[0]微软在1994年发行的Excel 5.0版本中,即具备了VBA的宏功能。[0]因此通俗来讲,VBA就是基于Office软件的编程语言,为Visual Basic的子集,其最终成果为宏。[0]VBA编写录制的宏在Office办公中有不可替代的作用,对于提高工作效率优势明显,具有以下优点:使重复的任务自动化、简单化;可以自定义Excel工具栏、菜单和界面;可以自定义模板、报表;对数据进行复杂的操作和分析;VB基础简单、易学等,但不可否认,由于宏程序的易于安装、传播,不良人员易于制作病毒进行传播对计算机、文档造成损坏。同时,由于加密简单,易于破解,其成果易于被他人窃取。[0]

Visual Basic for Applications,其简称为VBA,是Visual Basic的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。[1]主要用来扩展Windows的应用程序功能,特别是Microsoft Office软件,也可说是一种应用程式视觉化的Basic脚本,实际上,VBA是寄生于VB应用程序的版本。[1]微软在1994年发行的Excel 5.0版本中,即具备了VBA的宏功能。[1]因此通俗来讲,VBA就是基于Office软件的编程语言,为Visual Basic的子集,其最终成果为宏。[1]

VBA编写录制的宏在Office办公中有不可替代的作用,对于提高工作效率优势明显,具有以下优点:使重复的任务自动化、简单化;可以自定义Excel工具栏、菜单和界面;可以自定义模板、报表;对数据进行复杂的操作和分析;VB基础简单、易学等,但不可否认,由于宏程序的易于安装、传播,不良人员易于制作病毒进行传播对计算机、文档造成损坏。同时,由于加密简单,易于破解,其成果易于被他人窃取。[1]

发展沿革

VisualBasicforApplications(简称VBA)是新一代标准宏语言,是基于VisualBasicforWindows发展而来的。它与传统的宏语言不同,传统的宏语言不具有高级语言的特征,没有面向对象的程序设计概念和方法。而VBA提供了面向对象的程序设计方法,提供了相当完整的程序设计语言。VBA易于学习掌握,可以使用宏记录器记录用户的各种操作并将其转换为VBA程序代码。这样用户可以容易地将日常工作转换为VBA程序代码,使工作自动化。

VBA是基于Visualbasic发展而来的,与VB具有相似的语言结构。从语言结构上讲,VBA是VB的一个子集,它们的语法结构是一样的。两者的开发环境也几乎相同。但是,VB是独立的开发工具,它不需要依附于任何其他应用程序,它有自己完全独立的工作环境和编译、链接系统。VBA却没有自己独立的工作环境,它必须依附于某一个主应用程序,VBA专门用于Office的各应用程序中,如Word、Excel、Access等。在Access中,可以通过VBA编写模块来满足特定的需要。

正是由于VBA与主应用程序的这种关系,使得它与主程序之间的通信变得简单而高效。它与AutoCAD完全共享内存空间,所以执行速度比用C语言开发的ADS应用程序要快很多。

VBA提供了面向对象的程序设计方法,提供了相当完整的程序设计语言。它的编写是以子过程和函数为单位,在Access中以模块形式出现。

Office取得巨大成功的一个重要原因就是VBA,使用VBA可以完成很多事情,基于Excel、Word的VBA小程序不计其数。Office中的应用程序可以共享VBA语言,如果掌握了在Excel2016中使用VBA的方法,那么在Word、PowerPoint中使用VBA自然会变得易如反掌。掌握对VBA语言的使用,可以让复杂的工作简易化,减少不必要的重复性工作,大大提高我们的工作效率。

VBA程序员很多是业余程序员,正因为业余,解决的却是工作中需要解决的问题;所以,VBA程序大多都是只是在部门内部或个人使用的小工具。集成了VBA的其他应用程序也很多,但真正能为程序增色的不多。

大多数人看到了VBA可以自动化一个程序,可以扩展已有程序,但没有看到在Office中,VBA代码可以是录制的,而不是写出来的,带来的好处是,学习曲线变得非常缓。如果没有宏录制功能,要熟悉某个Office组件的对象模型,绝非一日之功。

以ArcGIS为例,ArcGIS扩展必须使用ArcObject,不管是使用VBA也罢,VB也罢,还是C++也罢。但同时,ArcObject的学习不是一天两天可以搞定,对于业余程序员,要使用VBA来扩展ArcGIS,几乎没有可能;专业程序员又不屑使用VBA;而对于公司,如果要基于ArcObject来扩展ArcGIS,选择VBA意味着源码的保护很困难。所以,ArcGIS的VBA就如同鸡肋。

VB与VBA

VBA是基于VisualBasic发展而来的,它们具有相似的语言结构。VisualBasic是Microsoft的主要图形界面开发工具,VBA5.0(亦即VBA97)则是VisualBasic5.0的子集。VisualBasic是由Basic发展而来的第四代语言。VisualBasic作为一套独立的Windows系统开发工具,可用于开发Windows环境下的各类应用程序,是一种可视化的、面向对象的、采用事件驱动方式的结构化高级程序设计语言。它具有高效率、简单易学及功能强大的特点。VB的程序语言简单、便捷,利用其事件驱动的编程机制,新颖易用的可视化设计工具,并使用Windows应用程序接口(API)函数,采用动态链接库(DLL)、动态数据交换(DDE)、对象的链接与嵌入(OLE)以及开放式数据库访问(ODBC)等技术,可以高效、快速地编制出Windows环境下功能强大、图形界面丰富的应用软件系统。

VisualBasic程序很大一部分以可视(Visual)形式实现,这意味着在设计阶段就可以看到程序运行的屏幕画面,用户可以在设计时能够方便地改动画面图像、大小、颜色等,直到满意为止。VB的用户可以是缺乏Windows及C语言开发经验的专业软件人员,也可以是具有一定Windows开发经验的专业人员,VB的可视化编程方法使得原来繁琐枯燥、令人生畏的Windows应用程序设计变得轻松自如、妙趣横生。以往的Windows应用程序开发工具在设计图形用户界面时,都是采用编程的方法,并伴随大量的计算任务,一个大型应用程序约有90%的程序代码用来处理用户界面,而且在程序设计过程中不能看到界面显示的效果,只有在程序执行时才能观察到,如果界面效果不佳,还需要回到程序中去修改。VisualBasic提供了新颖的可视化设计工具,巧妙地将Windows界面设计的复杂性封装起来,程序开发人员不必再为界面设计而编写大量程序代码,仅需采用现有工具按设计者要求的布局,在屏幕上画出所需界面,并为各图形对象设置属性即可,VB自动产生界面设计代码,这样便将事先编制好的控件可视地连接到一起,构成一个随时可调整的界面。

VBA不但继承了VB的开发机制,而且VBA还具有与VB相似的语言结构,它们的集成开发环境IDE(IntergratedDevelopmentEnvironment)也几乎相同。但是,经过优化,VBA专门用于Office的各应用程序。VB可运行直接来自Windows95或NT桌面上的应用程序,而VBA的项目(Project)仅由使用VBA的Excel、Word、PowerPoint等称为宿主(Host)的Office应用程序(Application)来调用。

区别

1.VB是设计用于创建标准的应用程序,而VBA是使已有的应用程序(EXCEL等)自动化。

2.VB具有自己的开发环境,而VBA必须寄生于已有的应用程序。

3.要运行VB开发的应用程序,用户不必安装VB,因为VB开发出的应用程序是可执行文件(*.EXE),而VBA开发的程序必须依赖于它的父应用程序,例如EXCEL。

4.VBA是VB的一个子集

尽管存在这些不同,VBA和VB在结构上仍然十分相似。事实上,如果你已经了解了VB,会发现学习VBA非常快。相应的,学完VBA会给学习VB打下坚实的基础。而且,当学会在EXCEL中用VBA创建解决方案后,即已具备在WORDACCESSOUTLOOKFOXPROPOWERPOINT中用VBA创建解决方案的大部分知识。

*VBA一个关键特征是你所学的知识在微软的一些产品中可以相互转化。

*VBA可以称作EXCEL的“遥控器”。

主要功能

由于微软Office软件的普及,人们常见的办公软件Office软件中的Word、Excel、Access、Powerpoint都可以利用VBA使这些软件的应用更高效率,例如:通过一段VBA代码,可以实现画面的切换;可以实现复杂逻辑的统计(比如从多个表中,自动生成按合同号来跟踪生产量、入库量、销售量、库存量的统计清单)等。

VBA6
VBA6

掌握了VBA,可以发挥以下作用:

1.规范用户的操作,控制用户的操作行为;

2.操作界面人性化,方便用户的操作;

3.多个步骤的手工操作通过执行VBA代码可以迅速的实现;

4.实现一些VB无法实现的功能。

5.用VBA制做EXCEL登录系统。

6.利用VBA可以Excel内轻松开发出功能强大的自动化程序。

基本数据类型

即PrimaryTypeData,下述列表的括号内为字节数:

Byte(1):无符号数类型,取值范围0-255Boolean(2)Integer(2)Long(4)Single(4)Double(8)Currency(8)Decimal(14)Date(8)StringObject(4)Variant(根据分配确定)

自定义的数据类型

相当于C语言的struct,例如:

Type自定义类型名元素名As类型…[元素名As类型]EndType

数组

OptionBase0:数组索引值从0开始OptionBase1:数组索引值从1开始DimMyArray(10):声明一个数组变量,10是最大的可用的数组索引值MyArray(5)=101:给数组的元素赋值DimData(10,5):声明一个二维数组变量Data(1,1)="A001":给数组元素赋值DimcArr(-11To20,1To3)AsString:声明一个数组,定义数组索引值的上下界DimdArr()AsString:声明动态数组ReDimdArr(0To5,1To2):改变动态数组的尺寸默认把原数据清除。如果保留原来的数据,必须加上参数Preserve:使用Preserve参数时只能改变最后一位的大小IfUBound(vTemp)=-1Then:判断数组变量vTemp是否为空数组EndIfEraseMyArrar,DataErase语句清除数组元素,释放变量占用的空间

系统定义常量

系统定义常量有3个:True、False和Null。

固有常量

固有常量是编程时引用的对象库定义的常量。所有固有常量都可以在宏或VBA代码中使用。通常,固有常量通过前两个字母来指明定义该常量。来自VB库的常量则以“vb”开头。来自Access的常量以“ac”开头。可以使用对象浏览器来查看所有对象库中的固有常量列表。

在VBA中,常量的数据类型有整型、长整型、单精度型、双精度型、字节型、货币型、字符型、日期型和逻辑型。一个整型数据就是一个整型常量,一个长整型数据就是一个长整型常量。例如,12%、-1%是整型常量,32768&、10000000&是长整型常量,-2.51、3.14是单精度实型常量,3.1415926#是双精度实型常量,China、Shanghai是字符型常量,#07/13/200111:45PM#是日期常量,由符号“#”将字符括起来。

符号常量

可以自行定义的常量即符号常量,必须先定义,后使用。可见,需要声明的常量都是符号常量。

基本语法格式:

1[Publicr/Private]Const常量名[As类型]=表达式

如:GlobalConst符号常量名称=常量值

语句功能:

定义一个符号常量,并将指定表达式的值赋给符号常量。

语句说明如下:

1)“常量名”指定符号常量的名字。符号常量名可以由字母、数字和下画线组成,但只能以字母开头,不能含有空格。

2)“表达式”指定符号常量的值。该表达式通常由数值型、字符型、逻辑型或日期型数据以及各种运算符组成,但在表达式中不能出现变量和函数。

3)public用来表示这个常量的作用范围是整个数据库的所有模块。

4)private则表示这个常量只在使用该声明常量语句的模块中起作用。

说明:

1)除用户定义的符号常量外,VBA还提供了许多符号常量,我们可以直接使用。

2)对数码比较长,并且在程序中多次使用的常量,通常使用符号常量代替。运行程序时,系统自动把程序中的所有符号常量换为赋给它的值。

与常量一样,变量也是一块内存空间,用于保存程序运行过程中可能变化的数据。变量的名称是用户定义的一个标识符。

在代码中需要使用该变量时,只需引用相应的标识符即可,而不用管变量当前的值具体是什么。

声明

与用户自定义的常量相似,变量在使用之前都需要声明,在VBA中声明变量的语法格式有以下几种:

关键字变量名AS数据类型关键字变量1,变量2...变量nAS数据类型关键字变量1AS数据类型,变量2As数据类型,...,变量nAS数据类型

在第二种语法格式中,“变量n”的数据类型为AS关键字后定义的数据类型,而“变量1”、“变量2”、…的数据类型为变体型。

在VBA中,可用Dim、Private、Public和Static这4个关键字来声明变量,使用不同关键字声明的变量其含义也有所不同。

◆利用Dim关键字声明变量:Dim关键字主要用来在内存中分配一块空间,并为该空间命名,是VBA中声明变量最常用的关键字。使用Dim关键字声明的变量只能在当前过程或模块中使用。

◆利用Private关键字声明变量:Private关键字用于在类模块中声明一个私有变量,它只能在当前的类模块中使用。当定义变量的位置同处于类模块中时,其使用效果与使用Dim关键字定义的变量相同。

◆利用Public关键字声明变量:利用Public关键字声明的变量可以在程序的任何地方调用,而与声明变量的位置无关。

◆利用Static关键字声明变量:Static关键字用于声明静态变量,即变量的值在整个代码运行期间都能被保留。

赋值

变量在使用时还需要对其进行赋值。在VBA中对变量进行赋值可通过“=”符号或“Set”关键字进行。通过“=”符号对变量赋值的语法格式有以下几种。

变量名=数据变量1=变量2运算符数据变量1=变量2运算符变量3…运算符变量n

如果在定义变量时指定了变量的数据类型,则为变量所赋的值也必须是该数据类型的值。如果变量定义为Integer类型,而在赋值时却给了变量一个String类型的数据,则在编译运行的过程中将弹出错误弹框。

运算符是在程序中执行计算功能的某些特殊符号,它是程序代码的重要组成部分。在程序代码中,运算符不能单独使用,必须与其操作数共同组成表达式后才具有运算意义。VBA中的运算符包含算术运算符、连接运算符、比较运算符和逻辑运算符等。

算术运算符

算术运算符主要用于执行四则运算,仅用算术运算符连接起来的表达式称为算术表达式。算术运算符及其作用与示例如表所示。

例子名称结果-$a取反$a的负值。$a+$b加法$a和$b的和。$a-$b减法$a和$b的差。$a*$b乘法$a和$b的积。$a/$b除法$a除以$b的商,允许小数。$a\$b除法$a除以$b的商,结果取整。$aMod$b取余$a除以$b的余数

注意:

在执行算术运算时,运算符两侧操作的数据类型必须相同,否则会出现“类型不匹配”的错误提示。当“+”运算符左右两侧都是字符串类型的操作数时,执行是连接运算,如表达式“"Pass+"word"的计算结果为字符串“PassWord”。

连接运算符

连接运算符的作用是将运算符两侧的操作数连接成一个数,其操作数的数据类型通常都为String类型。VBA中的连接运算符有“&”和“+”两种,由于使用“+”执行连接运算时,容易与加法运算混淆,所以通常都采用“&”进行连接运算。

比较运算符

比较运算符可以对运算符两侧的操作数执行比较运算,其返回结果为Boolean类型的True或False。比较运算符的操作数通常为具体的数值,当操作数为字符串或其他符号时,是根据该符号的ASCII码进行比较的。VBA中的比较运算符及其作用与示例如表所示。

例子名称结果$a=$b等于TRUE,如果$a等于$b。$a<>$b不等TRUE,如果$a不等于$b。$a<$b小于TRUE,如果$a严格小于$b。$a>$b大于TRUE,如果$a严格大于$b。$a<=$b小于等于TRUE,如果$a小于或者等于$b。$a>=$b大于等于TRUE,如果$a大于或者等于$b。

逻辑运算符

逻辑运算符用于对运算符两侧的操作数执行逻辑运算,参与逻辑运算的操作数本身可以是逻辑表达式(表达式的最终结果为True或False),也可以是算术表达式(表达式的最终返回值为0或非0)。

在逻辑运算中,数值0与逻辑值False相同,表示逻辑假;非0数值与True相同,表示逻辑真。逻辑运算符及其含义与示例如表所示。

例子名称结果$aand$bAnd(逻辑与)TRUE,如果$a与$b都为TRUE。$aor$bOr(逻辑或)TRUE,如果$a或$b任一为TRUE。$axor$bXor(逻辑异或)TRUE,如果$a或$b同位相异。Not(1>2)Not(逻辑非)TRUE。(1>2)Eqv(1>2)两个操作数同为假,返回False;两个操作数同为真,返回True;两个操作数一真一假,返回FalseTRUE。2<>1Imp3<5运算符左右同为真,返回True;左右同为假,返回True;左真右假,回返False;左假右真,返回TrueTRUE。

if语句

1if条件1then语句1elseif条件2then语句2elseif......else语句nendif

SelectCase语句

1SelectCase表达式Case表达式列表1语句1Case表达式列表2语句2...Case表达式列表n语句nEndSelect

其中的表达式列表可以为:

表达式例:"A"用逗号分隔的一组枚举表达式例:2,4,6,8表达式1To表达式2例:60To100Is关系运算符表达式例:Is<60

Do...Loop语句

1DoWhile或Until条件语句块1ExitDo语句块2Loop

For...Next语句

1Do语句块1ExitDo语句块2LoopWhile或Until条件

ForEach…Next语句

1For循环控制变量=初值To终值Step步长语句块‘ExitFor语句可以跳出循环体Next

跳出本次循环的continue语句

1For循环控制变量=初值To终值Step步长Do'用于模拟continue语句块If条件ThenExitDo'用于模拟continue语句块LoopWhileFalse'用于模拟continueNext

With语句

1With对象引用语句块EndWith

OnError语句

1OnErrorGoto出错处理语句的label'跳转到出错处理语句

1OnErrorResumeNext'遇到错误,不管错误,继续往下执行

具有控制作用的函数

If(条件式,表达式1,表达式2)Switch(条件式1,表达式1,[条件式2,表达式2[,...,条件式n,表达式n]])Choose(索引式,选项1[,选项2,...[,选项n]])'这是基于1的索引

注释语句

使用REM或者单引号开始的行。

语句的连写与续行

如果一行包括多条语句,用冒号分割各个语句。跨多行的语句,在行末用“空格加下划线”表示续行

过程与函数

12Sub过程名(参数表)语句块ExitSub语句块EndSub

1Function函数名(参数表)AsType语句块函数名=表达式ExitFunctionEndFunction

可以是Private、Public、Friend、Static等修饰。

调用函数/过程时,可以加括号或者不加括号。如果调用表达式作为一行的一部分,那么必须用参数,例如函数调用的返回值赋给变量。调用过程时,可以使用/不使用call关键字。使用call语句调用过程,如果无参数,则不加括号;如果有参数,必须加括号。如果调用时用括号包住单个参数,则该参数强行按值传递。需要特别注意,不用call不加括号的调用,形参与实参是传值(passedbyvalue)而不是传引用(passedbyreference),这会导致一些对象的方法调用失败。

常用内置函数

VBA的常用内置函数:

MsgBoxInputBox舍入函数:Fix向0取整,Int向下取整,Round四舍五入Rnd:返回0-1内的单精度随机数字符串函数:Filter:对字符串的一维数组的过滤InStr([Start,]<Str1>,<Str2>[,Compare])与InStrRev:查找子串Len:字符串长度Join:连接一维数组中的所有子字符串Left,Right,Mid:截取子字符串Space(数值):生成空格字符串Ucase,Lcase:大小写转换函数Ltrim,Rtrim,Trim:删除首尾空格ReplaceSplit:分割一个字符串成为一维数组StrComp:字符串比较StrConv:字符串转换String(number,character):制定字符重复若干次StrReverse日期/时间有关函数:Year,Month,Day,WeekDay,Hour,Minute,Second:截取日期时间分量DateAdd:日期/时间增量函数DateDiff(<间隔类型>,<日期1>,<日期2>[,W1][,W2])日期/时间的距离函数DatePart(<分割类型>,<日期>[,w1][,w2])时间分割函数DateSerial(<表达式1>,<表达式2>,<表达式3>)合成日期;DateValue(“字符串表达式”)返回日期;Date,Time,Now,Timer:返回日期时间DateValueTimeSerial:由时间序列得到时间对象TimeValue:由时间字符串得到时间对象Weekday:获得日期的周几WeekdayName转换函数:CBool、CByte、CCur、CDate、CDbl、CDec、CInt、CLng、CLngLng、CLngPtr、CSng、CStr、CVar、CVErr、Asc(<字符串表达式>)返回第一个字符的Ascii编码值、Chr(ASCII码)返回字符、Hex、Oct、Str(<数值表达式>)返回字符串、Val(string)、Format、FormatCurrency、FormatDateTime、FormatNumber、FormatPercent、MonthName。Nz(表达式或字段属性值[,规定值])如果是空,则返回0或者""或者函数的第二个参数值验证函数:isNumeric、isDate、isNull、isEmpty、IsArray、IsError、IsMissing、IsObject数学函数:Abs、Sqr、Tan、Atn(即atan)、Sin、Cos、Exp(e为基的指数)、Log自然对数Array:构造一个Array对象CallByName:getorsetaproperty,orinvokeamethodatruntimeusingastringname.控制流:Choose:类似于C语言的select语句、If相当于IF-ELSE语句、SwitchCommand:获取命令行参数CreateObject:创建ActiveX对象CurDir:返回指定驱动器的当前工作路径由基本数学函数导出的函数:Sec、Cosec、Cotangent、Cotan、Arcsin、Arccos、Arcsec、Arccosec、Arccotan、HSin、HCos、HTan、HSec、HCosec、HCotan、HArcsin、HArccos、HArctan、HArcsec、HArccosec、HArccotan、LogNDoEvents:暂时把CPU控制权交回给系统Environ:返回环境变量的值文件操作:Dir:返回满足条件的所有文件、目录的名字EOFFileAttrFileDateTimeFileLenFreeFileFunctionGetAttr:返回文件、目录的属性值Input:读取文件Loc:文件指针位置LOF:文件打开时的指针位置Seek:文件指针定位Spc:使用Print做positionoutputTab:用于Print函数Error:错误号对应的错误消息WindowsRegistry中的数据:GetAllSettings、SaveSetting、DeleteSetting、GetSettingGetObject:ActiveX组建的引用IMEStatus:返回当前InputMethodEditor(IME)Macintosh平台:MacID、MacScript金融函数:DDB:使用double-decliningbalance计算贬值FV:计算固定利率的年金IPmt:计算利率IRR:计算利率MIRR:计算利率NPer:计算周期数NPV:计算netpresentvaluePmt:计算支付数PPmt:计算本金支付数PV:计算presentvalueRate:利息率SLN:straight-linedepreciationSYD:计算sum-of-years'digitsdepreciationPartition:返回字符串,表示一个数值名字落在各个range内。常用于SQLselect语句QBColor:颜色值RGB:颜色值TypeName:得到变量的类型名VarType:得到变量的类型数

参考资料 1

  1. 参考 1
广告位:底部(ad-bottom)—— 请到中台「公共区块」编辑此内容